Java8 Stream流操作在用户系统中的妙用

在做目前这个项目的时候,发现以前有一个筛选的需求,老程序员是这么做的,先请求Http服务器得到一长串json数据,大概用A4纸打了40多页那么多,然后将这些对象写入到sqlite数据库中,再用数据库查询语句根据筛选条件查出来。最后将数据库丢弃。把我们这些新程序员看的目瞪口呆。自从接触了Java8之后,发现可以像操作数据库一样操作内存,而且在Stream操作中对内存的开销十分友善,操作方式十分灵活,减少了IO的支出,简直爽歪歪。

传统的数据处理都是用循环来解决,而不是像搜索数据库那样有具体的搜索语句,而Java8的Stream提供了很好的方案,往往一行就搞定了,而且Stream还可以链式操作,一行代码实现多个循环的功能,代码风格十分像nosql数据库,但是在实际应用中发现一个巨大的问题,就是执行耗时特别长,时间开销是传统方法的几百倍,这是一个巨大的问题。

本文主要来讨论一下如何发挥Stream的优势展示对用户管理操作

首先我们制造一个User类用来代表用户,里面有姓名年龄密码等常用字段,顺道再写个构造函数和toString(),如下

public class User
	{
		public int age;//年龄
		public String name;//姓名
		private String password;//密码
		public short gendar;//性别,0未知,1男,2女
		public boolean hasMarried;//是否已婚
		
		
		public String getPassword() {
			return password;
		}
		
		public User(int age, String name, String password, short gendar,
				boolean hasMarried) {
			super();
			this.age = age;
			this.name = name;
			this.password = password;
			this.gendar = gendar;
			this.hasMarried = hasMarried;
		}
		@Override
		public String toString() {
			return "{\"age\":\"" + age + "\", \"name\":\"" + name
					+ "\", \"password\":\"" + password + "\", \"gendar\":\""
					+ gendar + "\", \"hasMarried\":\"" + hasMarried + "\"} \n";
		}
	}

现在我们伪造一点数据,暂时就用我大学同学的名字吧:

ArrayList<User> users = new ArrayList<User>();
		users.add(new User(22, "王旭", "123456", (short)1, true));
		users.add(new User(22, "王旭", "123456", (short)1, true));
		users.add(new User(22, "王旭", "123456", (short)1, true));
		users.add(new User(21, "孙萍", "a123456", (short)2, false));
		users.add(new User(23, "步传宇", "b123456", (short)1, false));
		users.add(new User(18, "蔡明浩", "c123456", (short)1, true));
		users.add(new User(17, "郭林杰", "d123456", (short)1, false));
		users.add(new User(5, "韩凯", "e123456", (short)1, true));
		users.add(new User(22, "韩天琪", "f123456", (short)2, false));
		users.add(new User(21, "郝玮", "g123456", (short)2, false));
		users.add(new User(19, "胡亚强", "h123456", (short)1, false));
		users.add(new User(14, "季恺", "i123456", (short)1, false));
		users.add(new User(17, "荆帅", "j123456", (short)1, true));
		users.add(new User(16, "姜有琪", "k123456", (short)1, false));
				
		

场景一、对用户进行排序

首先我们制定一个排序规则:按照年龄大小进行排序,设计一个Comparator

Comparator<User> ageComparator = new Comparator<User>() {

			@Override
			public int compare(User o1, User o2) {
				// TODO Auto-generated method stub
				if(o1.age>o2.age)return 1;
				if(o1.age<o2.age)return -1;
				return 0;
			}
		};

传统方式排序:

time = System.currentTimeMillis();
Collections.sort(users, ageComparator);
System.out.println("耗时"+(System.currentTimeMillis()-time));
System.out.println(users);
输出结果:

耗时0
[{"age":"5", "name":"韩凯", "password":"e123456", "gendar":"1", "hasMarried":"true"}
, {"age":"14", "name":"季恺", "password":"i123456", "gendar":"1", "hasMarried":"false"}
, {"age":"16", "name":"姜有琪", "password":"k123456", "gendar":"1", "hasMarried":"false"}
, {"age":"17", "name":"郭林杰", "password":"d123456", "gendar":"1", "hasMarried":"false"}
, {"age":"17", "name":"荆帅", "password":"j123456", "gendar":"1", "hasMarried":"true"}
, {"age":"18", "name":"蔡明浩", "password":"c123456", "gendar":"1", "hasMarried":"true"}
, {"age":"19", "name":"胡亚强", "password":"h123456", "gendar":"1", "hasMarried":"false"}
, {"age":"21"

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值